package cn.cqs.redisitem.utils;

import java.util.Arrays;

/**
 * 进制转换
 */
public class IntCovertBinary {
    /**
     *二进制数一般分8位、 16位、32位以及64位
     * @param data
     * @param digits 转换的二进制位数，位数不足则在前面补0的个数
     * @return
     */
    public static String toBainary32bit(int data, int digits) {
        String cover = Integer.toBinaryString(1 << digits).substring(1);
        String s = Integer.toBinaryString(data);
        return s.length() < digits ? cover.substring(s.length()) + s : s;
    }

    /**
     *利用移位操作对一个十进制数进行移位操作，
     * 即数移至最低位（移31位），
     * 除将最高位的最低位其余位置清零，使用与位& 操作，可以使用和1相与（&），
     * 再移次高位，做相同的操作，直到最后一位
     *
     * 说明：由于计算机中存储的都是数的补码，正数的原码、反码、补码都是相同的；
     * 而负数的原码、反码、补码是不一样的，补码=原码取反+1（符号位不变）。
     * 所以，负数是按照它的补码输出的。
     * >>>为逻辑移位符，向右移n位，高位补0 是无符号移位，无论值的正负，都在高位补0
     * >> 为算数移位符，也是向右移n位，不同的是：正数高位补0，负数高位补1
     * << 为算数移位符，向左移n位，低位补0
     * ^为位运算与或，相同为0，不同为1
     * |为位运算或，1或任务数为1
     * @param data
     * @return
     */
    public static String toBinary(int data){
        StringBuffer sb = new StringBuffer();
        if(data<0){
            data=~data;
            for (int i=31;i>=0;i--) {
                int a= data >>> i & 1;
                if((i+1)%8==0){
                    sb.append(" ");
                }
                sb.append(a);
            }
        }else{
            for (int i=31;i>=0;i--) {
                int a= data >>> i & 1;
                if((i+1)%8==0){
                    sb.append(" ");
                }
                sb.append(a);
            }
        }

        return sb.toString();
    }



}
